package pers.cfeng.server.dataManage.page;

import pers.cfeng.server.dataManage.pageCache.PageCacheConstant;
import pers.cfeng.server.utils.RandomUtil;

import java.util.Arrays;

/**
 * db文件的pageNo为1的页需要完成额外功能， 这里就需要做启动检查
 * 判断100 — 107 和 108 - 115字节是否相同
 * 一页总共是8KB字节数组，区别就是普通的页和首页，页面的数据data的方式
 */

public class PageFirst {
    private static final int OFFSET_RUN_CONTROL = 100; //启动检查起始字节偏移
    private static final int LEN_RUN_CONTROL = 8;

    public static byte[] initRaw() {
        byte[] raw = new byte[PageCacheConstant.PAGE_SIZE];
        setRunControlOpen(raw);
        return raw;
    }

    /**
     * 打开db时，随机字节序列
     */
    public static void setRunControlOpen(Page page) {
        page.setModified(true);
        setRunControlOpen(page.getData());
    }

    private static void setRunControlOpen(byte[] raw) {
        //随机生成byte数组放到100 -- 107
        System.arraycopy(RandomUtil.randomBytes(LEN_RUN_CONTROL), 0, raw, OFFSET_RUN_CONTROL, LEN_RUN_CONTROL);
    }

    public static boolean checkRunControl(Page page) {
        return checkRunControl(page.getData());
    }

    public static boolean checkRunControl(byte[] raw) {
        return Arrays.equals(Arrays.copyOfRange(raw, OFFSET_RUN_CONTROL, OFFSET_RUN_CONTROL + LEN_RUN_CONTROL),
                Arrays.copyOfRange(raw, OFFSET_RUN_CONTROL + LEN_RUN_CONTROL,OFFSET_RUN_CONTROL + 2 * LEN_RUN_CONTROL));
    }

    public static void setRunControlClose(Page page) {
        page.setModified(true);
        setRunControlClose(page.getData());
    }
    //正常关闭将第一页100-107的字节复制到108-- 115
    private static void setRunControlClose(byte[] raw) {
        System.arraycopy(raw, OFFSET_RUN_CONTROL, raw, OFFSET_RUN_CONTROL + LEN_RUN_CONTROL,LEN_RUN_CONTROL);
    }
}

